ปลดล็อกประสบการณ์เว็บที่ลื่นไหลเหมือนแอป คู่มือฉบับสมบูรณ์นี้จะสำรวจ pseudo-elements ของ CSS View Transition ที่ทรงพลัง สำหรับการสร้างสไตล์ให้กับการเปลี่ยนหน้าเว็บแบบไดนามิก พร้อมตัวอย่างและแนวทางปฏิบัติที่ดีที่สุด
เชี่ยวชาญ CSS View Transitions: เจาะลึกการจัดสไตล์ Pseudo-Element
ในโลกของการพัฒนาเว็บที่มีการเปลี่ยนแปลงอยู่เสมอ การแสวงหาประสบการณ์ผู้ใช้ที่ราบรื่น ลื่นไหล และน่าดึงดูดนั้นเป็นสิ่งที่เกิดขึ้นตลอดเวลา เป็นเวลาหลายปีที่นักพัฒนาพยายามลดช่องว่างระหว่างเว็บและแอปพลิเคชันเนทีฟ โดยเฉพาะอย่างยิ่งในเรื่องความราบรื่นของการเปลี่ยนหน้าเว็บ การนำทางเว็บแบบดั้งเดิมมักส่งผลให้เกิดการโหลดหน้าใหม่ทั้งหมดอย่างกระทันหัน ซึ่งเป็นหน้าจอสีขาวว่างเปล่าที่ขัดจังหวะการมีส่วนร่วมของผู้ใช้ชั่วขณะ Single-Page Applications (SPAs) ได้ช่วยลดปัญหานี้ แต่การสร้างทรานซิชันที่มีความหมายและปรับแต่งได้เองยังคงเป็นงานที่ซับซ้อนและเปราะบาง ซึ่งต้องพึ่งพาไลบรารี JavaScript และการจัดการสถานะที่ซับซ้อนอย่างมาก
ขอแนะนำ CSS View Transitions API เทคโนโลยีที่จะมาปฏิวัติวิธีที่เราจัดการกับการเปลี่ยนแปลง UI บนเว็บ API ที่ทรงพลังนี้มีกลไกที่เรียบง่ายแต่ยืดหยุ่นอย่างไม่น่าเชื่อสำหรับการสร้างแอนิเมชันระหว่างสถานะ DOM ที่แตกต่างกัน ทำให้การสร้างประสบการณ์ที่สวยงามเหมือนแอปที่ผู้ใช้คาดหวังนั้นง่ายกว่าที่เคย หัวใจสำคัญของพลังของ API นี้คือชุดของ CSS pseudo-elements ใหม่ๆ สิ่งเหล่านี้ไม่ใช่ selectors ทั่วไป แต่เป็นองค์ประกอบชั่วคราวที่สร้างขึ้นแบบไดนามิกโดยเบราว์เซอร์ เพื่อให้คุณควบคุมทุกขั้นตอนของทรานซิชันได้อย่างละเอียด คู่มือนี้จะพาคุณเจาะลึกเข้าไปในโครงสร้างของ pseudo-element เหล่านี้ สำรวจวิธีการจัดสไตล์แต่ละองค์ประกอบเพื่อสร้างแอนิเมชันที่น่าทึ่ง มีประสิทธิภาพ และเข้าถึงได้สำหรับผู้ชมทั่วโลก
โครงสร้างของ View Transition
ก่อนที่เราจะสามารถจัดสไตล์ทรานซิชันได้ เราต้องเข้าใจสิ่งที่เกิดขึ้นเบื้องหลังเมื่อมีการเรียกใช้งาน เมื่อคุณเริ่มต้น view transition (ตัวอย่างเช่น โดยการเรียกใช้ document.startViewTransition()) เบราว์เซอร์จะดำเนินการตามขั้นตอนต่างๆ ดังนี้:
- บันทึกสถานะเก่า (Capture Old State): เบราว์เซอร์จะทำการ "จับภาพหน้าจอ" ของสถานะปัจจุบันของหน้าเว็บ
- อัปเดต DOM: โค้ดของคุณจะทำการเปลี่ยนแปลง DOM (เช่น การนำทางไปยังมุมมองใหม่ การเพิ่มหรือลบองค์ประกอบ)
- บันทึกสถานะใหม่ (Capture New State): เมื่อการอัปเดต DOM เสร็จสิ้น เบราว์เซอร์จะจับภาพหน้าจอของสถานะใหม่
- สร้างโครงสร้าง Pseudo-Element (Build the Pseudo-Element Tree): จากนั้นเบราว์เซอร์จะสร้างโครงสร้างชั่วคราวของ pseudo-elements ใน overlay ของหน้าเว็บ โครงสร้างนี้จะเก็บภาพที่บันทึกไว้ของสถานะเก่าและสถานะใหม่
- สร้างแอนิเมชัน (Animate): CSS animations จะถูกนำไปใช้กับ pseudo-elements เหล่านี้ เพื่อสร้างทรานซิชันที่ราบรื่นจากสถานะเก่าไปยังสถานะใหม่ ค่าเริ่มต้นคือ cross-fade แบบง่ายๆ
- ล้างข้อมูล (Cleanup): เมื่อแอนิเมชันเสร็จสิ้น โครงสร้าง pseudo-element จะถูกลบออก และผู้ใช้สามารถโต้ตอบกับ DOM ใหม่ที่มีชีวิตได้
กุญแจสำคัญในการปรับแต่งคือโครงสร้าง pseudo-element ชั่วคราวนี้ ลองนึกภาพว่ามันเป็นชุดของเลเยอร์ในเครื่องมือออกแบบ ที่วางซ้อนอยู่บนหน้าเว็บของคุณชั่วคราว คุณสามารถควบคุมเลเยอร์เหล่านี้ด้วย CSS ได้อย่างสมบูรณ์ นี่คือโครงสร้างที่คุณจะได้ทำงานด้วย:
- ::view-transition
- ::view-transition-group(*)
- ::view-transition-image-pair(*)
- ::view-transition-old(*)
- ::view-transition-new(*)
- ::view-transition-image-pair(*)
- ::view-transition-group(*)
มาดูกันว่าแต่ละ pseudo-element เหล่านี้หมายถึงอะไร
ทำความรู้จักกับ Pseudo-Elements
::view-transition: นี่คือรากของโครงสร้างทั้งหมด เป็นองค์ประกอบเดียวที่เติมเต็ม viewport และอยู่เหนือเนื้อหาอื่นๆ ทั้งหมดของหน้าเว็บ ทำหน้าที่เป็นคอนเทนเนอร์สำหรับกลุ่มทรานซิชันทั้งหมด และเป็นที่ที่เหมาะสำหรับกำหนดคุณสมบัติของทรานซิชันโดยรวม เช่น duration หรือ timing function
::view-transition-group(*): สำหรับแต่ละองค์ประกอบที่กำลังเกิดทรานซิชัน (ระบุโดยคุณสมบัติ CSS view-transition-name) จะมีการสร้างกลุ่มขึ้นมา pseudo-element นี้มีหน้าที่รับผิดชอบในการสร้างแอนิเมชันของตำแหน่งและขนาดของเนื้อหาภายใน หากคุณมีการ์ดที่เคลื่อนที่จากด้านหนึ่งของหน้าจอไปยังอีกด้านหนึ่ง ::view-transition-group คือสิ่งที่กำลังเคลื่อนที่จริงๆ
::view-transition-image-pair(*): อยู่ภายใน group ทำหน้าที่เป็นคอนเทนเนอร์และ clipping mask สำหรับมุมมองเก่าและใหม่ บทบาทหลักของมันคือการรักษาเอฟเฟกต์ต่างๆ เช่น border-radius หรือ transform ระหว่างการแอนิเมชัน และจัดการกับแอนิเมชัน cross-fade ที่เป็นค่าเริ่มต้น
::view-transition-old(*): สิ่งนี้แสดงถึง "ภาพหน้าจอ" หรือมุมมองที่เรนเดอร์ขององค์ประกอบในสถานะเก่า (ก่อนการเปลี่ยนแปลง DOM) โดยค่าเริ่มต้น มันจะเคลื่อนไหวจาก opacity: 1 ไปยัง opacity: 0
::view-transition-new(*): สิ่งนี้แสดงถึง "ภาพหน้าจอ" หรือมุมมองที่เรนเดอร์ขององค์ประกอบในสถานะใหม่ (หลังการเปลี่ยนแปลง DOM) โดยค่าเริ่มต้น มันจะเคลื่อนไหวจาก opacity: 0 ไปยัง opacity: 1
Root: การจัดสไตล์ให้ ::view-transition Pseudo-Element
::view-transition pseudo-element คือผืนผ้าใบที่แอนิเมชันทั้งหมดของคุณจะถูกวาดลงไป ในฐานะคอนเทนเนอร์ระดับบนสุด มันเป็นที่ที่เหมาะสมที่สุดในการกำหนดคุณสมบัติที่ควรใช้กับทรานซิชันโดยรวมทั้งหมด โดยค่าเริ่มต้น เบราว์เซอร์จะมีชุดแอนิเมชันมาให้ แต่คุณสามารถเขียนทับได้อย่างง่ายดาย
ตัวอย่างเช่น ทรานซิชันเริ่มต้นคือ cross-fade ที่ใช้เวลา 250 มิลลิวินาที หากคุณต้องการเปลี่ยนแปลงสิ่งนี้สำหรับทุกทรานซิชันบนเว็บไซต์ของคุณ คุณสามารถกำหนดเป้าหมายไปที่ root pseudo-element ได้:
::view-transition {
animation-duration: 500ms;
animation-timing-function: ease-in-out;
}
กฎง่ายๆ นี้ทำให้การเฟดหน้าเว็บเริ่มต้นทั้งหมดใช้เวลานานขึ้นสองเท่าและใช้เส้นโค้ง 'ease-in-out' ทำให้รู้สึกแตกต่างออกไปเล็กน้อย แม้ว่าคุณจะสามารถใช้แอนิเมชันที่ซับซ้อนที่นี่ได้ แต่โดยทั่วไปแล้วจะใช้เพื่อกำหนดเวลาและ easing แบบสากล และปล่อยให้ pseudo-elements ที่เฉพาะเจาะจงกว่าจัดการกับการออกแบบท่าเต้นที่มีรายละเอียด
การจัดกลุ่มและการตั้งชื่อ: พลังของ `view-transition-name`
โดยที่ไม่ต้องทำอะไรเพิ่มเติม View Transition API จะให้ cross-fade สำหรับทั้งหน้าเว็บ ซึ่งจัดการโดย pseudo-element group เดียวสำหรับ root พลังที่แท้จริงของ API นี้จะถูกปลดล็อกเมื่อคุณต้องการสร้างทรานซิชันสำหรับองค์ประกอบเฉพาะแต่ละชิ้นระหว่างสถานะต่างๆ ตัวอย่างเช่น การทำให้ภาพขนาดย่อของผลิตภัณฑ์ในหน้ารายการขยายและเคลื่อนที่ไปยังตำแหน่งภาพผลิตภัณฑ์หลักในหน้ารายละเอียดได้อย่างราบรื่น
เพื่อบอกเบราว์เซอร์ว่าองค์ประกอบสองชิ้นในสถานะ DOM ที่แตกต่างกันนั้นเป็นสิ่งเดียวกันในทางแนวคิด คุณต้องใช้คุณสมบัติ CSS view-transition-name คุณสมบัตินี้ต้องถูกนำไปใช้กับทั้งองค์ประกอบเริ่มต้นและองค์ประกอบสิ้นสุด
/* ใน CSS ของหน้ารายการ */
.product-thumbnail {
view-transition-name: product-image;
}
/* ใน CSS ของหน้ารายละเอียด */
.main-product-image {
view-transition-name: product-image;
}
ด้วยการตั้งชื่อที่เป็นเอกลักษณ์เดียวกันให้กับองค์ประกอบทั้งสอง ('product-image' ในกรณีนี้) คุณกำลังสั่งเบราว์เซอร์ว่า: "แทนที่จะแค่เฟดหน้าเก่าออกและเฟดหน้าใหม่เข้ามา ให้สร้างทรานซิชันพิเศษสำหรับองค์ประกอบนี้โดยเฉพาะ" ตอนนี้เบราว์เซอร์จะสร้าง ::view-transition-group(product-image) เฉพาะเพื่อจัดการแอนิเมชันของมันแยกต่างหากจากการเฟดของ root นี่คือแนวคิดพื้นฐานที่ทำให้เกิดเอฟเฟกต์ทรานซิชันแบบ "morphing" หรือ "shared element" ที่เป็นที่นิยม
หมายเหตุสำคัญ: ในช่วงเวลาใดก็ตามระหว่างทรานซิชัน view-transition-name จะต้องไม่ซ้ำกัน คุณไม่สามารถมีองค์ประกอบที่มองเห็นได้สองชิ้นที่มีชื่อเดียวกันในเวลาเดียวกันได้
การจัดสไตล์เชิงลึก: Core Pseudo-Elements
เมื่อองค์ประกอบของเราได้รับการตั้งชื่อแล้ว ตอนนี้เราสามารถเจาะลึกการจัดสไตล์ pseudo-elements เฉพาะที่เบราว์เซอร์สร้างขึ้นสำหรับพวกมันได้ นี่คือจุดที่คุณสามารถสร้างแอนิเมชันที่ปรับแต่งได้เองและแสดงออกได้อย่างแท้จริง
`::view-transition-group(name)`: The Mover
ความรับผิดชอบเพียงอย่างเดียวของ group คือการเปลี่ยนจากขนาดและตำแหน่งขององค์ประกอบเก่าไปยังขนาดและตำแหน่งขององค์ประกอบใหม่ มันไม่ได้บรรจุรูปลักษณ์ของเนื้อหาจริง แต่เป็นเพียงกรอบล้อมรอบ (bounding box) ของมันเท่านั้น ลองนึกภาพว่าเป็นกรอบที่กำลังเคลื่อนที่
โดยค่าเริ่มต้น เบราว์เซอร์จะสร้างแอนิเมชันให้กับคุณสมบัติ transform และ width/height ของมัน คุณสามารถเขียนทับสิ่งนี้เพื่อสร้างเอฟเฟกต์ที่แตกต่างออกไปได้ ตัวอย่างเช่น คุณสามารถเพิ่มส่วนโค้งให้กับการเคลื่อนที่โดยการทำให้มันเคลื่อนที่ไปตามเส้นทางโค้ง หรือทำให้มันขยายและย่อขนาดระหว่างการเดินทาง
::view-transition-group(product-image) {
animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
}
ในตัวอย่างนี้ เรากำลังใช้ easing function เฉพาะกับการเคลื่อนที่ของภาพผลิตภัณฑ์เท่านั้น ทำให้มันรู้สึกมีไดนามิกและจับต้องได้มากขึ้น โดยไม่ส่งผลกระทบต่อการเฟดเริ่มต้นของส่วนที่เหลือของหน้า
`::view-transition-image-pair(name)`: The Clipper and Fader
ซ้อนอยู่ภายใน group ที่กำลังเคลื่อนที่ image-pair จะเก็บมุมมองเก่าและใหม่ไว้ มันทำหน้าที่เป็น clipping mask ดังนั้นหากองค์ประกอบของคุณมี border-radius ตัว image-pair จะช่วยให้แน่ใจว่าเนื้อหายังคงถูกตัดด้วยรัศมีนั้นตลอดการแอนิเมชันขนาดและตำแหน่ง งานหลักอีกอย่างของมันคือการควบคุมการ cross-fade เริ่มต้นระหว่างเนื้อหาเก่าและใหม่
คุณอาจต้องการจัดสไตล์องค์ประกอบนี้เพื่อให้แน่ใจว่ามีความสอดคล้องทางสายตาหรือเพื่อสร้างเอฟเฟกต์ที่ซับซ้อนมากขึ้น คุณสมบัติสำคัญที่ควรพิจารณาคือ isolation: isolate สิ่งนี้สำคัญมากหากคุณวางแผนที่จะใช้เอฟเฟกต์ mix-blend-mode ขั้นสูงกับ children (เก่าและใหม่) เนื่องจากมันจะสร้าง stacking context ใหม่และป้องกันไม่ให้การผสมสีส่งผลกระทบต่อองค์ประกอบนอกกลุ่มทรานซิชัน
::view-transition-image-pair(product-image) {
isolation: isolate;
}
`::view-transition-old(name)` and `::view-transition-new(name)`: The Stars of the Show
นี่คือ pseudo-elements ที่แสดงถึงรูปลักษณ์ขององค์ประกอบของคุณก่อนและหลังการเปลี่ยนแปลง DOM นี่คือที่ที่งานแอนิเมชันที่คุณกำหนดเองส่วนใหญ่จะเกิดขึ้น โดยค่าเริ่มต้น เบราว์เซอร์จะรันแอนิเมชัน cross-fade แบบง่ายๆ บนพวกมันโดยใช้ opacity และ mix-blend-mode เพื่อสร้างแอนิเมชันที่กำหนดเอง คุณต้องปิดแอนิเมชันเริ่มต้นก่อน
::view-transition-old(name),
::view-transition-new(name) {
animation: none;
}
เมื่อแอนิเมชันเริ่มต้นถูกปิดใช้งานแล้ว คุณก็มีอิสระที่จะใช้แอนิเมชันของคุณเอง มาสำรวจรูปแบบทั่วไปบางอย่างกัน
Custom Animation: Slide
แทนที่จะใช้ cross-fade ลองทำให้เนื้อหาของคอนเทนเนอร์เลื่อนเข้ามา ตัวอย่างเช่น เมื่อนำทางระหว่างบทความ เราต้องการให้ข้อความของบทความใหม่เลื่อนเข้ามาจากทางขวาในขณะที่ข้อความเก่าเลื่อนออกไปทางซ้าย
ก่อนอื่น ให้กำหนด keyframes:
@keyframes slide-from-right {
from { transform: translateX(100%); }
to { transform: translateX(0); }
}
@keyframes slide-to-left {
from { transform: translateX(0); }
to { transform: translateX(-100%); }
}
ตอนนี้ นำแอนิเมชันเหล่านี้ไปใช้กับ pseudo-elements เก่าและใหม่สำหรับองค์ประกอบที่ชื่อ 'article-content'
::view-transition-old(article-content) {
animation: 300ms ease-out forwards slide-to-left;
}
::view-transition-new(article-content) {
animation: 300ms ease-out forwards slide-from-right;
}
Custom Animation: 3D Flip
สำหรับเอฟเฟกต์ที่น่าทึ่งยิ่งขึ้น คุณสามารถสร้างการพลิกการ์ดแบบ 3 มิติได้ สิ่งนี้ต้องการการสร้างแอนิเมชันของคุณสมบัติ transform ด้วย rotateY และยังต้องจัดการ backface-visibility ด้วย
/* group ต้องการบริบท 3 มิติ */
::view-transition-group(card-flipper) {
transform-style: preserve-3d;
}
/* image-pair ก็ต้องการรักษาบริบท 3 มิติเช่นกัน */
::view-transition-image-pair(card-flipper) {
transform-style: preserve-3d;
}
/* มุมมองเก่าจะพลิกจาก 0 เป็น -180 องศา */
::view-transition-old(card-flipper) {
animation: 600ms ease-in forwards flip-out;
backface-visibility: hidden;
}
/* มุมมองใหม่จะพลิกจาก 180 เป็น 0 องศา */
::view-transition-new(card-flipper) {
animation: 600ms ease-out forwards flip-in;
backface-visibility: hidden;
}
@keyframes flip-out {
from { transform: rotateY(0deg); }
to { transform: rotateY(-180deg); }
}
@keyframes flip-in {
from { transform: rotateY(180deg); }
to { transform: rotateY(0deg); }
}
ตัวอย่างการใช้งานจริงและเทคนิคขั้นสูง
ทฤษฎีมีประโยชน์ แต่การนำไปใช้จริงคือสิ่งที่เราเรียนรู้ได้อย่างแท้จริง มาดูสถานการณ์ทั่วไปบางอย่างและวิธีแก้ปัญหาด้วย view transition pseudo-elements กัน
ตัวอย่าง: ภาพขนาดย่อของการ์ดแบบ "Morphing"
นี่คือทรานซิชันแบบ shared element สุดคลาสสิก ลองจินตนาการถึงแกลเลอรีโปรไฟล์ผู้ใช้ แต่ละโปรไฟล์คือการ์ดที่มีอวตาร เมื่อคุณคลิกที่การ์ด คุณจะไปที่หน้ารายละเอียดซึ่งอวตารเดียวกันนั้นจะแสดงอย่างโดดเด่นที่ด้านบน
ขั้นตอนที่ 1: กำหนดชื่อ
ในหน้าแกลเลอรีของคุณ รูปอวตารจะได้รับชื่อ ชื่อควรเป็นเอกลักษณ์สำหรับแต่ละการ์ด เช่น อิงตาม ID ของผู้ใช้
/* ใน gallery-item.css */
.card-avatar { view-transition-name: avatar-user-123; }
ในหน้ารายละเอียดโปรไฟล์ อวตารขนาดใหญ่ในส่วนหัวจะได้รับชื่อเดียวกันเป๊ะ
/* ใน profile-page.css */
.profile-header-avatar { view-transition-name: avatar-user-123; }
ขั้นตอนที่ 2: ปรับแต่งแอนิเมชัน
โดยค่าเริ่มต้น เบราว์เซอร์จะย้ายและปรับขนาดอวตาร แต่ก็จะทำการ cross-fade เนื้อหาด้วย หากภาพเหมือนกัน การเฟดนี้ไม่จำเป็นและอาจทำให้เกิดการกระพริบเล็กน้อย เราสามารถปิดมันได้
/* เครื่องหมายดอกจัน (*) ในที่นี้คือ wildcard สำหรับ group ที่มีชื่อใดๆ */
::view-transition-image-pair(*) {
/* ปิดการเฟดเริ่มต้น */
animation-duration: 0s;
}
เดี๋ยวก่อน ถ้าเราปิดการเฟด แล้วเนื้อหาจะสลับได้อย่างไร สำหรับ shared elements ที่มุมมองเก่าและใหม่เหมือนกัน เบราว์เซอร์จะฉลาดพอที่จะใช่มุมมองเดียวสำหรับทรานซิชันทั้งหมด โดยพื้นฐานแล้ว `image-pair` จะเก็บภาพเพียงภาพเดียว ดังนั้นการปิดการเฟดจึงเป็นการเปิดเผยการเพิ่มประสิทธิภาพนี้ สำหรับองค์ประกอบที่เนื้อหาเปลี่ยนแปลงจริงๆ คุณจะต้องมีแอนิเมชันที่กำหนดเองแทนที่การเฟดเริ่มต้น
การจัดการการเปลี่ยนแปลงอัตราส่วนภาพ (Aspect Ratio)
ความท้าทายทั่วไปเกิดขึ้นเมื่อองค์ประกอบที่กำลังเกิดทรานซิชันมีการเปลี่ยนแปลงอัตราส่วนภาพ ตัวอย่างเช่น ภาพขนาดย่อแนวนอน 16:9 ในหน้ารายการอาจเปลี่ยนไปเป็นอวตารสี่เหลี่ยมจัตุรัส 1:1 ในหน้ารายละเอียด พฤติกรรมเริ่มต้นของเบราว์เซอร์คือการสร้างแอนิเมชันความกว้างและความสูงอย่างอิสระ ซึ่งส่งผลให้ภาพดูบิดเบี้ยวหรือยืดออกระหว่างทรานซิชัน
วิธีแก้ปัญหานั้นเรียบง่าย เราปล่อยให้ ::view-transition-group จัดการการเปลี่ยนแปลงขนาดและตำแหน่ง แต่เราจะเขียนทับสไตล์ของภาพเก่าและใหม่ภายในนั้น
เป้าหมายคือการทำให้ "ภาพหน้าจอ" เก่าและใหม่เติมเต็มคอนเทนเนอร์ของมันโดยไม่บิดเบี้ยว เราสามารถทำได้โดยการตั้งค่าความกว้างและความสูงเป็น 100% และปล่อยให้คุณสมบัติ object-fit เริ่มต้นของเบราว์เซอร์ (ซึ่งสืบทอดมาจากองค์ประกอบดั้งเดิม) จัดการการปรับขนาดอย่างถูกต้อง
::view-transition-old(hero-image),
::view-transition-new(hero-image) {
/* ป้องกันการบิดเบี้ยวโดยการเติมเต็มคอนเทนเนอร์ */
width: 100%;
height: 100%;
/* เขียนทับ cross-fade เริ่มต้นเพื่อให้เห็นผลชัดเจน */
animation: none;
}
ด้วย CSS นี้ `image-pair` จะสร้างแอนิเมชันอัตราส่วนภาพของมันอย่างราบรื่น และภาพภายในจะถูกตัดหรือมีแถบดำ (ขึ้นอยู่กับค่า `object-fit` ของมัน) อย่างถูกต้อง เหมือนกับที่มันจะอยู่ในคอนเทนเนอร์ปกติ จากนั้นคุณสามารถเพิ่มแอนิเมชันที่คุณกำหนดเอง เช่น cross-fade ทับบนรูปทรงที่แก้ไขแล้วนี้ได้
การดีบักและการรองรับของเบราว์เซอร์
การจัดสไตล์องค์ประกอบที่มีอยู่เพียงชั่วครู่สามารถทำได้ยาก โชคดีที่เบราว์เซอร์สมัยใหม่มีเครื่องมือสำหรับนักพัฒนาที่ยอดเยี่ยมสำหรับเรื่องนี้ ใน Chrome หรือ Edge DevTools คุณสามารถไปที่แผง "Animations" และเมื่อคุณเรียกใช้ view transition คุณสามารถหยุดมันชั่วคราวได้ เมื่อแอนิเมชันหยุดชั่วคราว คุณสามารถใช้แผง "Elements" เพื่อตรวจสอบโครงสร้าง pseudo-element `::view-transition` ทั้งหมดได้เหมือนกับส่วนอื่นๆ ของ DOM คุณสามารถดูสไตล์ที่กำลังถูกนำไปใช้และแม้กระทั่งแก้ไขได้แบบเรียลไทม์เพื่อทำให้แอนิเมชันของคุณสมบูรณ์แบบ
ณ ปลายปี 2023 View Transitions API ได้รับการสนับสนุนในเบราว์เซอร์ที่ใช้ Chromium (Chrome, Edge, Opera) และกำลังดำเนินการพัฒนาสำหรับ Firefox และ Safari สิ่งนี้ทำให้มันเป็นตัวเลือกที่สมบูรณ์แบบสำหรับ progressive enhancement ผู้ใช้ที่มีเบราว์เซอร์ที่รองรับจะได้รับประสบการณ์ที่ดีขึ้นและน่าพึงพอใจ ในขณะที่ผู้ใช้บนเบราว์เซอร์อื่นจะได้รับการนำทางแบบทันทีตามมาตรฐาน คุณสามารถตรวจสอบการรองรับใน CSS ได้:
@supports (view-transition: none) {
/* สไตล์ view-transition ทั้งหมดจะอยู่ที่นี่ */
::view-transition-old(my-element) { ... }
}
แนวทางปฏิบัติที่ดีที่สุดสำหรับผู้ชมทั่วโลก
เมื่อสร้างแอนิเมชัน สิ่งสำคัญคือต้องพิจารณาผู้ใช้และอุปกรณ์ที่หลากหลายทั่วโลก
ประสิทธิภาพ (Performance): แอนิเมชันควรจะรวดเร็วและลื่นไหล ควรสร้างแอนิเมชันเฉพาะคุณสมบัติ CSS ที่เบราว์เซอร์ประมวลผลได้ไม่เปลืองทรัพยากร โดยหลักๆ คือ transform และ opacity การสร้างแอนิเมชันคุณสมบัติเช่น width, height, หรือ margin อาจทำให้เกิดการคำนวณเค้าโครงใหม่ในทุกเฟรม ซึ่งนำไปสู่การกระตุกและประสบการณ์ที่ไม่ดี โดยเฉพาะบนอุปกรณ์ที่มีกำลังประมวลผลต่ำ
การเข้าถึง (Accessibility): ผู้ใช้บางคนอาจมีอาการเมารถหรือรู้สึกไม่สบายจากแอนิเมชัน ระบบปฏิบัติการหลักทั้งหมดมีการตั้งค่าให้ผู้ใช้ลดการเคลื่อนไหว เราต้องเคารพสิ่งนี้ prefers-reduced-motion media query ช่วยให้คุณสามารถปิดหรือลดความซับซ้อนของแอนิเมชันสำหรับผู้ใช้เหล่านี้ได้
@media (prefers-reduced-motion: reduce) {
::view-transition-group(*),
::view-transition-old(*),
::view-transition-new(*) {
/* ข้ามแอนิเมชันที่กำหนดเองทั้งหมดและใช้การเฟดที่รวดเร็วและเรียบง่าย */
animation: none !important;
}
}
ประสบการณ์ผู้ใช้ (UX): ทรานซิชันที่ดีควรมีจุดประสงค์ มันควรจะชี้นำความสนใจของผู้ใช้และให้บริบทเกี่ยวกับการเปลี่ยนแปลงที่เกิดขึ้นใน UI แอนิเมชันที่ช้าเกินไปอาจทำให้แอปพลิเคชันรู้สึกอืดอาด ในขณะที่แอนิเมชันที่ฉูดฉาดเกินไปอาจทำให้เสียสมาธิ ตั้งเป้าหมายให้ระยะเวลาทรานซิชันอยู่ระหว่าง 200ms ถึง 500ms เป้าหมายคือเพื่อให้แอนิเมชันถูก 'รู้สึก' มากกว่าที่จะถูก 'เห็น'
บทสรุป: อนาคตที่ลื่นไหล
CSS View Transitions API และโดยเฉพาะอย่างยิ่งโครงสร้าง pseudo-element ที่ทรงพลังของมัน ถือเป็นก้าวกระโดดครั้งสำคัญสำหรับส่วนติดต่อผู้ใช้บนเว็บ มันมอบชุดเครื่องมือที่เป็น native มีประสิทธิภาพ และปรับแต่งได้สูงให้กับนักพัฒนา เพื่อสร้างทรานซิชันที่ลื่นไหลและคงสถานะ ซึ่งครั้งหนึ่งเคยเป็นเอกสิทธิ์ของแอปพลิเคชันเนทีฟเท่านั้น ด้วยความเข้าใจในบทบาทของ ::view-transition, ::view-transition-group, และคู่ image old/new คุณสามารถก้าวไปไกลกว่าการเฟดแบบง่ายๆ และออกแบบแอนิเมชันที่ซับซ้อนและมีความหมาย ซึ่งช่วยเพิ่มความสามารถในการใช้งานและสร้างความพึงพอใจให้กับผู้ใช้
เมื่อการรองรับของเบราว์เซอร์ขยายวงกว้างขึ้น API นี้จะกลายเป็นส่วนสำคัญของชุดเครื่องมือของนักพัฒนา front-end สมัยใหม่ ด้วยการยอมรับความสามารถของมันและปฏิบัติตามแนวทางปฏิบัติที่ดีที่สุดด้านประสิทธิภาพและการเข้าถึง เราสามารถสร้างเว็บที่ไม่เพียงแต่ใช้งานได้ดีขึ้น แต่ยังสวยงามและใช้งานง่ายขึ้นสำหรับทุกคน ทุกที่